package ar.fi.uba.fallas2;

import ar.fi.uba.fallas2.business.*;
import ar.fi.uba.fallas2.data.DataException;

import java.util.Scanner;

public class Test {
    public static void main(String[] args) throws Exception {
    	KnowledgeMatrix m = new KnowledgeMatrix();
    	int cantQuestions = 0;
    	Question q = m.getNextQuestion();
    	GuessObject obj = null;
    	
    	while(cantQuestions < 5 && q != null) {
    		m.addActualAnswer(q, getUserAnswer(q));
    		GuessObject tmpObj = m.getNextProbableObject();
    		
    		if (m.canGuessObject()) {
    			if (isUserObject(tmpObj)) {
    				obj = tmpObj;
    				break;
    			} else {
    				m.addMissedObject(tmpObj);
    			}
    		}
    		
    		
    		cantQuestions++;
    		q = m.getNextQuestion();
    	}
    	
    	if (obj == null) {
    		// Si despues de las N preguntas, no pudo llegar a arriesgar ningun
    		// objeto, entonces arriesga el que mas se le pueda parecer.
    		obj = m.getNextProbableObject();
    		if (isUserObject(obj)) {
    			System.out.println("Te adivine, es " + obj.getName());
    		} else {
    			// No se lo puedo adivinar, entonces se le pregunta que objeto penso
    			obj = learnObjectFromUser(m);
    		}
    	} else {
    		System.out.println("Te adivine, es " + obj.getName());
    	}
    	
    	m.update(obj);
    }
    
    public static AnswerKind getUserAnswer(Question q) {
    	// Aca va la respuesta del usuario
    	System.out.println(q.getQuestion());
    	AnswerKind answer;
        Scanner in = new Scanner(System.in);

        // Reads a single line from the console 
        // and stores into name variable
        while((answer = AnswerKind.getAnswer(in.nextLine())) == null) {
        	System.out.println("No se entiende tu respuesta, por favor, tipeala de nuevo:");
        }
        

    	return answer;
    }
    
    public static GuessObject learnObjectFromUser(KnowledgeMatrix m) {
    	// Se le pregunta al usuario el objeto de que penso
    	System.out.println("No te pude adivinar el objeto, cual es?");
        Scanner in = new Scanner(System.in);
        
    	String objectName = in.nextLine();
    	GuessObject obj = m.getObjectByName(objectName);
    	if (obj == null) {
    		obj = new GuessObject();
    		obj.setName(objectName);
    		try {
    			obj.save();
    		} catch (DataException e) {
    			e.printStackTrace();
    		}
    	}
    	return obj;
    }
    
    public static boolean isUserObject(GuessObject o) {
    	// Aca se le pregunta al usuario si el objeto adivinado es o no el que 
    	// habia pensado
    	System.out.println("Acaso es un " + o.getName() + "?");
    	Scanner in = new Scanner(System.in);
    	if (in.nextLine().equals("si")) {
    		return true;
    	}
    	return false;
    }
}
